package com.example.hadoop.mapreduce.wordcount;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

import java.io.IOException;

/**
 * Created with IntelliJ IDEA.
 *
 * @Auther: Brian
 * @Date: 2020/04/21/9:20
 * @Description:
 * KEYIN,VALUEIN 对应mapper中的KEYOUT,VALUEOUT
 * KEYOUT: 用户自定义的输出key值： 本Demo中是单词
 * VALUE: 用户自定义的输出Value值：本Demo中是总数
 */
public class WordCountReducer extends Reducer<Text, IntWritable, Text, LongWritable> {

    /**
     * <单词1,1><单词1,1><单词1,1><单词1,1><单词1,1>
     * <单词2,1><单词2,1><单词2,1><单词2,1><单词2,1><单词2,1>
     * <单词2,1><单词2,1><单词2,1><单词2,1><单词2,1><单词2,1>
     * 入参key，是一组相同键值对的key
     * 入参value，是一组相同键值对的value
     * --> reducetask对每一组key-value都调用一次reduce方法
     * --> 本demo中的map输出是<Text, IntWritable>，所以拿到的是每一组key-value
     * @param key
     * @param values
     * @param context
     * @throws IOException
     * @throws InterruptedException
     */
    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        // 因为是一组相同key的键值对，所以key就一个
        int count = 0;
        for (IntWritable writable : values) {
            count += writable.get();
        }
        context.write(key, new LongWritable(count));
    }
}
